#pragma once

#include <string>
#include <iostream>
#include <unistd.h>
#include <stdarg.h>

#include "time_util.hpp"

#define DEBUG       0
#define INFO        1
#define WARNING     2
#define ERROR       3
#define FATAL       4

const char* str(int lv) {
    switch(lv) {
        case DEBUG      :   return  "DEBUG";
        case INFO       :   return  "INFO";
        case WARNING    :   return "WARNING";
        case ERROR      :   return "ERROR";
        case FATAL      :   return "FATAL";
        default         :   return "";
    }
}

void log(int lv, const char *format, ...) {
#define SIZE 1024
    char pre[SIZE];
    snprintf(pre, sizeof(pre), "[%s][%s][pid=%d] ", str(lv), util::time::datetime().c_str(), getpid());

    char suf[SIZE];

    va_list args;
    va_start(args, format); // 从 format 之后开始解析
    // format 是用户指定的格式，将 args 参数按照 format 格式输入到 suf 字符串中
    vsnprintf(suf, sizeof(suf), format, args);

    va_end(args);
    std::cout << pre << suf << std::endl;
}